(PYTHON) Day - 25 Closures and Decorators & Debugging

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Closures and Decorators

파이썬의 기초를 다루고 있어서 그런지 클로저와 데코레이터를 깊이 다루지는 않는다

기본개념

외부 참조
Understanding Python Decorators in 12 Easy Steps! - Simeon Franklin

Standardize Mobile Number Using Decorators


문제 : 전화번호를 양식에 맞게 수정하고 정렬해서 출력하는 문제
입력 : 전화번호는 10자리, 앞에 +91, 91, 0 등이 붙어서 입력될 수 있음
출력 : +91 xxxxx xxxxx 형식으로 출력

input
3
07895462130
919875641230
9195969878
output
+91 78954 62130
+91 91959 69878
+91 98756 41230

앞에 +91, 91, 0 중 무엇이 오던 그냥 뒤에서 10자리만 생각하면 된다

def wrapper(f):
def fun(l):
f([f"+91 {num[-10:-5]} {num[-5:]}" for num in l]) # f('+91 {} {}'.format(num[-10:-5], num[-5:]) for num in l)
return fun

@wrapper
def sort_phone(l):
print(\*sorted(l), sep='\n')

if **name** == '**main**':
l = [input() for _ in range(int(input()))]
sort_phone(l)

Decorators 2 - Name Directory


문제 : 이름, 나이, 성별을 입력받았을 때 나이순으로 출력하며 성별에 따라 이름 앞을 변경하는 문제
입력 : 이름, 나이, 성별
출력 : 남성이면 Mr, 여성이면 Ms 를 붙인다

input
3
Mike Thomson 20 M
Robert Bustle 32 M
Andria Bustle 30 F
output
Mr. Mike Thomson
Ms. Andria Bustle
Mr. Robert Bustle

리스트를 나이 순으로 정렬하고 포맷을 변경한다

import operator

def person_lister(f):
def inner(people):
return map(f, sorted(people, key= lambda x: int(x[2])))
return inner

@person_lister
def name_format(person):
return ("Mr. " if person[3] == "M" else "Ms. ") + person[0] + " " + person[1]

if **name** == '**main**':
people = [input().split() for i in range(int(input()))]
print(\*name_format(people), sep='\n')


Debugging

Problem

소스코드가 주어지고 디버깅을 통해 오류를 찾아내는 문제들이여서 생략함